<?php

class Controle{
	private $vista;
	private $registro;
	private $usuario;
	
	/**
	 * @constructor
	 * @classDescription Classe Controle que coordena todo fluxo de acoes do sistema. Instancia um Registro, verifica se o usuario esta logado, e executa a acao passada como parametro.
	 * @param string $acao
	 */
	
	public function Controle($acao){
		$this->setRegistro(new Registro());		
		
		if(isset($_SESSION['constructore']['usuario'])){
			$usuario	=	unserialize($_SESSION['constructore']['usuario']);
			$this->setUsuario($usuario);
			$this->registro->set('usuario', $this->usuario);
		}
		else{
			$this->setUsuario(null);
		}

		$acaoTratada	=	$this->trataAcao($acao);
		$this->executaAcao($acaoTratada);
	}
	
	/**
	 * Trata a acao recebida pelo contrutor
	 * @return string
	 * @param string $acao
	 */
	private function trataAcao($acao){
		return $acao;
	}
	
	
	/**
	 * Executa a acao passada a classe atraves do construtor.
	 * Faz a requisicao da pagina controle$acao.php, onde estao todos os comandos necessarios para a execucao da acao.
	 * @param string $acao
	 */
	private function executaAcao($acao){
		$controleAcao			=	'controle' . $acao . '.php';
		$arquivoControleAcao	=	__SITE_PATH . '/controls/' . $controleAcao;
		if(file_exists($arquivoControleAcao)){
			require($arquivoControleAcao);
		}
		else{
			header('Status: 404 Not Found');
			redireciona(array('404'));
		}
	}
	 
	 /**
	 * Retorna o Registro $registro do Controle.
	 * @return Registro
     * @see Vista::$registro
     */
    private function getRegistro()
    {
        return $this->registro;
    }
   
    /**
     * Seta o registro da Vista com $registro.
     * @param Registro $registro
     * @see Vista::$registro
     */
    private function setRegistro($registro)
    {
        $this->registro = $registro;
    }
   
    /**
     * Retorna o Usuario $usuario do Controle(Usuario do Sistema).
     * @return Usuario
     * @see Controle::$usuario
     */
    private function getUsuario()
    {
        return $this->usuario;
    }
   
    /**
     * Seta o Usuario $usuario do Controle(Usuario do Sistema).
     * @param Usuario $usuario
     * @see Controle::$usuario
     */
    private function setUsuario($usuario)
    {
        $this->usuario = $usuario;
    }

    /**
     * Retorna a Vista do Controle.
     * @return Vista
     * @see Controle::$vista
     */
    private function getVista()
    {
        return $this->vista;
    }
   
    /**
     * Seta a Vista do Controle.
     * @param Vista $vista
     * @see Controle::$vista
     */
    private function setVista($vista)
    {
        $this->vista = $vista;
	}
	
	/**
	 * Instancia uma Vista para o Controle e chama a funcao exibir da Vista para a pagina $pagina.
	 * @param string $pagina
	 */
	private function exibir($pagina){
		$this->setVista(new Vista($this->registro));
		$this->getVista()->exibir($pagina);
	}
	
}

?>
